home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // Large Background.c
- //
- // By Vern Jensen, August 1995
- ///--------------------------------------------------------------------------------------
-
-
- #include <SWFPSReport.h>
- #include <SWIncludes.h>
- #include <SWGameUtils.h>
-
- #include "SWApplication.h"
- #include "Large Background.h"
-
- #define kCreateMouseSprite true // keeps mouse from disappearing
- #define kShieldCursor false // hides the real mouse when over window
- #define kUseCopyBits false // uses CopyBits as ScreenDrawProc
-
- #define kDoubleSize true // doubles size of offscreen area
- #define kInterlacedMode false // turns Interlaced mode on/off
- #define kSyncToVBL false // sync SpriteWorld to VBL?
- #define kWorldRectInset 0 // make SpriteWorld smaller than window
- #define kMaxFPS 30 // set to 0 for unrestricted speed
-
- #define kNumSprites 30 // total number of sprites
- #define kMaxSpriteMoveDelta 10 // maximum speed of the sprites
-
- #define kEscKey 0x35 // optional way to end demo
-
-
-
- /***********/
- /* Globals */
- /***********/
-
- SpriteWorldPtr gSpriteWorldP;
- SpriteLayerPtr ballSpriteLayerP;
- SpriteLayerPtr mouseSpriteLayerP;
- SpritePtr gSpriteArray[kNumSprites];
- SpritePtr gMouseSpriteP;
- DrawProcPtr gSpriteDrawProc = SWStdSpriteDrawProc;
- DrawProcPtr gScreenDrawProc = SWStdWorldDrawProc;
- Rect gOffscreenRect;
- PicHandle gBackPictH;
- WindowPtr gWindowP;
- Boolean gDone;
-
-
- ///--------------------------------------------------------------------------------------
- // Main
- ///--------------------------------------------------------------------------------------
-
- void main( void )
- {
- Initialize(kNumberOfMoreMastersCalls);
-
- if (SWHasSystem7())
- {
- AllowKeyUpEvents();
- SetCursor(*GetCursor(watchCursor));
-
- CreateSpriteWorld();
- CreateBallSprites();
-
- if (kCreateMouseSprite)
- CreateMouseSprite();
-
- SetUpAnimation();
- RunAnimation();
- ShutDown();
-
- RestoreEventMask();
- }
- else
- {
- CantRunOnThisMachine();
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSpriteWorld
- ///--------------------------------------------------------------------------------------
-
- void CreateSpriteWorld( void )
- {
- RgnHandle mBarUpdateRgn;
- Rect windRect, worldRect;
- OSErr err;
-
- gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
-
- if (gWindowP != NULL)
- {
- // Center window in screen
- windRect = gWindowP->portRect;
- CenterRect(&windRect, &qd.screenBits.bounds);
- MoveWindow(gWindowP, windRect.left, windRect.top, false);
-
- ShowWindow(gWindowP);
- SetPort(gWindowP);
- mBarUpdateRgn = SWHideMenuBar(gWindowP); // Must be done *after* showing window!
- EraseRgn(mBarUpdateRgn);
-
- if (kInterlacedMode)
- PaintRect(&gWindowP->portRect); // Black out window for Interlaced mode
- }
- else
- CantFindResource();
-
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
-
- if ( GetDepthFromWindow(gWindowP) <= 2 )
- gBackPictH = GetPicture(129); // B&W pict
- else
- gBackPictH = GetPicture(128); // Color pict
-
- if (gBackPictH == nil)
- {
- SysBeep( 10 );
- ExitToShell();
- }
-
- gOffscreenRect = (**(gBackPictH)).picFrame;
-
- if (kDoubleSize)
- {
- gOffscreenRect.right *= 2;
- gOffscreenRect.bottom *= 2;
- }
-
-
- worldRect = gWindowP->portRect;
- InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
-
-
- // Create the SpriteWorld
- err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP,
- &worldRect, &gOffscreenRect, 0);
- FatalError(err);
-
-
- // Create the sprite layers
- err = SWCreateSpriteLayer(&ballSpriteLayerP);
- FatalError(err);
- err = SWCreateSpriteLayer(&mouseSpriteLayerP);
- FatalError(err);
-
- // add the layers to the world
- SWAddSpriteLayer(gSpriteWorldP, ballSpriteLayerP); // Bottom layer
- SWAddSpriteLayer(gSpriteWorldP, mouseSpriteLayerP); // Top layer
-
-
- // Determine what DrawProcs to use
- if (gSpriteWorldP->pixelDepth == 8) // 256 colors
- {
- if (kInterlacedMode)
- {
- gSpriteDrawProc = BP8BitInterlacedMaskDrawProc;
- gScreenDrawProc = BP8BitInterlacedRectDrawProc;
- }
- else
- {
- gSpriteDrawProc = CompiledSprite8BitDrawProc;
- gScreenDrawProc = BlitPixie8BitRectDrawProc;
- }
- }
- else // Not 256 colors
- {
- // Use interlaced drawProcs unless in B&W, where interlacing is ugly
- if (kInterlacedMode && gSpriteWorldP->pixelDepth > 2)
- {
- gSpriteDrawProc = BPAllBitInterlacedMaskDrawProc;
- gScreenDrawProc = BPAllBitInterlacedRectDrawProc;
-
- }
- else if (!(SW_PPC && gSpriteWorldP->pixelDepth < 8) ) // AllBit works on PPC only
- { // in 8-bits or above.
- gSpriteDrawProc = BlitPixieAllBitMaskDrawProc;
- gScreenDrawProc = BlitPixieAllBitRectDrawProc;
- }
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateBallSprites
- ///--------------------------------------------------------------------------------------
-
- void CreateBallSprites( void )
- {
- SpritePtr simpleSpriteP;
- short spriteNum;
- OSErr err;
-
- // Create the first sprite
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gSpriteArray[0], NULL,
- 128, 1, kFatMask);
- FatalError(err);
-
- if (gSpriteWorldP->pixelDepth == 8)
- SWCompileSprite(gSpriteArray[0]);
-
- // clone the rest of the sprites off the first one
- for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
- {
- err = SWCloneSprite(gSpriteArray[0], &gSpriteArray[spriteNum], NULL);
- FatalError(err);
- }
-
-
- // Set up the sprites in random locations with random deltas
- for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
- {
- simpleSpriteP = gSpriteArray[spriteNum];
-
- SWAddSprite(ballSpriteLayerP, simpleSpriteP);
- SWSetSpriteMoveBounds(simpleSpriteP, &gOffscreenRect);
- SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
- SWSetSpriteDrawProc(simpleSpriteP, gSpriteDrawProc);
-
- SWSetSpriteLocation(simpleSpriteP,
- GetRandom(0, gOffscreenRect.right),
- GetRandom(0, gOffscreenRect.bottom) );
-
- SWSetSpriteMoveDelta(simpleSpriteP,
- GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta),
- GetRandom(-kMaxSpriteMoveDelta, kMaxSpriteMoveDelta));
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateMouseSprite
- ///--------------------------------------------------------------------------------------
-
- void CreateMouseSprite( void )
- {
- OSErr err;
-
- // Create the mouse sprite
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &gMouseSpriteP, NULL,
- 129, 1, kPixelMask);
- FatalError(err);
-
- if (gSpriteWorldP->pixelDepth == 8)
- SWCompileSprite(gMouseSpriteP);
-
- SWAddSprite(mouseSpriteLayerP, gMouseSpriteP);
- SWSetSpriteDrawProc(gMouseSpriteP, gSpriteDrawProc);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpAnimation
- ///--------------------------------------------------------------------------------------
-
- void SetUpAnimation( void )
- {
- SWLockSpriteWorld(gSpriteWorldP);
-
- if (!kUseCopyBits) // Only set DrawProc to blitter if CopyBits is not to be used
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, gScreenDrawProc);
-
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, gScreenDrawProc);
- SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
- SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
- SWSetCleanUpSpriteWorld(gSpriteWorldP);
- SWSetScrollingWorldMoveBounds(gSpriteWorldP, &gSpriteWorldP->backRect);
-
- ForeColor(blackColor);
- BackColor(whiteColor);
-
- // Draw background
- SWSetPortToBackground(gSpriteWorldP);
- DrawPicture(gBackPictH, &gOffscreenRect);
-
- SetCursor(&qd.arrow);
- ShieldMyCursor();
-
- SWUpdateScrollingSpriteWorld(gSpriteWorldP, true);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // ShieldMyCursor
- ///--------------------------------------------------------------------------------------
-
- void ShieldMyCursor( void )
- {
- Rect shieldRect;
- Point globalOffset;
- Point blankPoint;
-
- if (kShieldCursor)
- {
- SWSetPortToWindow(gSpriteWorldP);
-
- SetPt(&globalOffset, 0, 0);
- LocalToGlobal(&globalOffset);
-
- SetPt(&blankPoint, 0, 0);
-
- shieldRect = gSpriteWorldP->windRect;
-
- OffsetRect(&shieldRect, globalOffset.h, globalOffset.v);
- InsetRect(&shieldRect, 16, 16);
- ShieldCursor(&shieldRect, blankPoint);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // RunAnimation
- ///--------------------------------------------------------------------------------------
-
- void RunAnimation( void )
- {
- EventRecord event;
-
- FatalError( SWStickyError() ); // Make sure no errors got past us during setup
-
- while (!gDone)
- {
- if ( WaitNextEvent(everyEvent, &event, 0L, NULL) )
- DispatchEvent(&event);
-
- // Make sure window wasn't "rolled up" with WindowShade
- if ( !EmptyRgn( gWindowP->visRgn ) )
- {
- SWProcessScrollingSpriteWorld(gSpriteWorldP);
-
- // Call the MouseSpriteMoveProc directly, so
- // it has the latest visScrollRect position
- if (kCreateMouseSprite)
- MouseSpriteMoveProc(gMouseSpriteP);
-
- FatalError( SWStickyError() ); // Make sure no errors occurred in a MoveProc, etc
-
- SWAnimateScrollingSpriteWorld(gSpriteWorldP);
- }
- }
-
- SWShowMenuBar(gWindowP);
- }
-
- ///--------------------------------------------------------------------------------------
- // DispatchEvent
- ///--------------------------------------------------------------------------------------
-
- void DispatchEvent(EventRecord* event)
- {
- short theKey, theChar;
- Boolean isDown;
-
- switch(event->what)
- {
- case mouseDown:
- HandleMouseDown( event );
- break;
- case mouseUp:
- break;
- case keyUp:
- break;
- case keyDown:
- case autoKey:
- theKey = (event->message & keyCodeMask) >> 8;
- theChar = event->message & charCodeMask;
- isDown = (event->what != keyUp);
-
- if ( (theKey == kEscKey) || (theChar == 'Q') || (theChar == 'q') )
- gDone = true;
- break;
- case updateEvt:
- break;
- case diskEvt:
- break;
- case activateEvt:
- break;
- case networkEvt:
- break;
- case driverEvt:
- break;
- case app1Evt:
- break;
- case app2Evt:
- break;
- case app3Evt:
- break;
- case osEvt:
- if ( ( event->message & suspendResumeMessage ) == resumeFlag )
- {
- ShieldMyCursor();
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, gScreenDrawProc);
- }
- else
- {
- ShowCursor();
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, SWStdWorldDrawProc);
- }
- break;
- case kHighLevelEvent:
- break;
- default:
- break;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // HandleMouseDown
- ///--------------------------------------------------------------------------------------
-
- void HandleMouseDown( EventRecord *eventPtr )
- {
- WindowPtr theWindow;
- short thePart;
- Point thePoint;
- long menuChoice;
-
-
- thePoint = eventPtr->where;
- thePart = FindWindow( thePoint, &theWindow );
-
- switch ( thePart )
- {
- case inSysWindow :
- SystemClick( eventPtr, theWindow );
- break;
- case inDrag:
- ShowCursor();
- DragWindow( theWindow, thePoint, &((**(GetGrayRgn())).rgnBBox) );
- ShieldMyCursor();
- SWWindowMoved( gSpriteWorldP );
- break;
- case inZoomOut:
- case inZoomIn:
- break;
- case inMenuBar:
- break;
- case inGoAway:
- if ( TrackGoAway(theWindow, thePoint) )
- gDone = true;
- break;
- case inGrow:
- break;
- case inContent:
- DragMouseInWindow(eventPtr);
- break;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // ShutDown (clean up and dispose of the SpriteWorld)
- ///--------------------------------------------------------------------------------------
-
- void ShutDown( void )
- {
- SWUnlockSpriteWorld(gSpriteWorldP);
- SWDisposeSpriteWorld(&gSpriteWorldP);
- SWExitSpriteWorld();
-
- FlushEvents(everyEvent, 0);
- ShowCursor();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
-
- SW_FUNC void BallSpriteMoveProc(SpritePtr ballSpriteP)
- {
- SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
-
- // SWBounceSprite(ballSpriteP);
- SWWrapSprite(ballSpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // MouseSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void MouseSpriteMoveProc(SpritePtr srcSpriteP)
- {
- Point mousePoint;
- SpritePtr tempSpriteP;
- EventRecord event;
- short theChar;
-
- // Get mouse coordinates local to the window
- SetPort(gWindowP);
- GetMouse(&mousePoint);
-
- // Subtract any offset from worldRect to window if a worldRect is used
- mousePoint.h -= gSpriteWorldP->windRect.left;
- mousePoint.v -= gSpriteWorldP->windRect.top;
-
- SWMoveSprite(srcSpriteP,
- mousePoint.h - 1 + gSpriteWorldP->visScrollRect.left,
- mousePoint.v - 1 + gSpriteWorldP->visScrollRect.top);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // DragMouseInWindow
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void DragMouseInWindow(EventRecord *eventPtr)
- {
- Point mousePoint, oldPoint;
- Rect oldVisScrollRect, destRect;
-
- oldPoint = eventPtr->where;
- oldVisScrollRect = gSpriteWorldP->visScrollRect;
-
- do
- {
- GetMouse(&mousePoint);
- LocalToGlobal(&mousePoint);
-
- destRect = oldVisScrollRect;
- OffsetRect(&destRect, oldPoint.h - mousePoint.h, oldPoint.v - mousePoint.v);
-
- if (kInterlacedMode)
- {
- if (destRect.top & 1)
- OffsetRect(&destRect, 0, 1);
- }
-
-
- SWMoveVisScrollRect(gSpriteWorldP, destRect.left, destRect.top);
-
- // Process a frame of the animation
- SWProcessScrollingSpriteWorld(gSpriteWorldP);
-
- if (kCreateMouseSprite)
- MouseSpriteMoveProc(gMouseSpriteP);
-
- SWAnimateScrollingSpriteWorld(gSpriteWorldP);
- }
- while (StillDown());
- }
-
-